package com.gitee.tianchaohongyu.jdcl.core;

import com.gitee.tianchaohongyu.jdcl.util.ReflectUtils;
import org.springframework.lang.Nullable;

import javax.validation.constraints.NotNull;
import java.lang.annotation.Annotation;

/**
 * 数据清洗器
 *
 * @param <T> 可以清洗的数据类型
 * @param <A> 此类型注解将触发该清洗器
 */
public interface Cleaner<T, A extends Annotation> {

  default <R extends T> R clean(@Nullable R data) {
    @SuppressWarnings("unchecked")
    Class<R> rClass = (Class<R>) (data == null ? ReflectUtils.getGenericsBySuper(getClass(), Cleaner.class)[0] : data.getClass());
    return clean(data, rClass, null);
  }

  /**
   * 清洗数据
   *
   * @param data        要清洗的数据
   * @param defineType 数据定义的类型(比如清洗器可以清洗Number，但实际类型为Integer，则要求接口返回Integer实例)
   * @param annotation  如果由注解触发这会附带注解实例
   * @param <R>         数据定义的类型
   * @return 返回清洗后的数据
   */
  @Nullable
  <R extends T> R clean(@Nullable R data, @NotNull Class<R> defineType, @Nullable A annotation);
}
